import cv2
import numpy as np

filename = 'code_of_teacher/snap_014.jpg'
src = cv2.imread(filename, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY).astype(np.float32)
# 角点检测
# 𝑅=𝑑𝑒𝑡𝐌−𝑘(𝑡𝑟𝑎𝑐𝑒𝐌)^2  根据经验𝑘的取值在(0.04,0.06)之间
# gray  - img 数据类型为 float32 的输入图像。
# 2 -block_size (角点检测中要考虑的领域大小)
# 3 Sobel 求导中使用的窗口大小(ksize)
# 0.04 (k)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 那么这里为什么要大于０．０5×ｄｓｔ.max()呢　注意了这里Ｒ是一个很大的值　
# 我们选取里面最大的Ｒ　然后　只要dst里面的值大于百分之一的Ｒ的最大值　　
# 那么此时这个dst的Ｒ值也是很大的　可以判定他为角点
src[dst > (0.05 * dst.max())] = (0, 0, 255) #最终把选定的点标成红色的点
cv2.imshow('harris corner', src)
cv2.waitKey(0)
cv2.destroyAllWindows()
